﻿#include "filecommon.h"
#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QDir>

FileCommon::FileCommon(QObject *parent) : QObject(parent)
{

}




/**
 * 单例模式
 * @brief Single::GetInstance
 * @return
 */
FileCommon& FileCommon::INSTANCE()
{
    /**
     * 局部静态特性的方式实现单实例。
     * 静态局部变量只在当前函数内有效，其他函数无法访问。
     * 静态局部变量只在第一次被调用的时候初始化，也存储在静态存储区，生命周期从第一次被初始化起至程序结束止。
     */
    static FileCommon single;
    return single;
}


/**
 * 读取文件，并返回内容
 * @brief readFile
 * @param filename
 * @param encoding
 * @return
 */
QString FileCommon::readFile(const QString& filename, const QString& encoding){

    if(!this->isFile(filename)){
        throw "文件不存在";
    }
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "文件打开失败";
        throw "文件打开失败";
    }

    QString out = "";
    try {
        QTextStream in(&file);
        while(!in.atEnd()){
            out += in.readAll();
        }
    }  catch (...) {


    }
    file.close();
    return out;
}

/**
 * 将文本内容写到文件中
 * @brief writeFile
 * @param filename 写入的文件路径
 * @param content 写入的内容
 * @param encoding 编码方式
 * @param append 是否追加到文件末尾
 * @return
 */
void FileCommon::writeFile(const QString& filename, QString& content, const QString& encoding, const bool append){
    QFile file(filename);
    try {
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
            qDebug() << "文件打开失败";
            throw "文件打开失败";
        }

        file.write(content.toUtf8());
    } catch (...) {

    }
    file.close();
}

/**
 * 是否存在该文件，或者判断该文件是否为文件
 * @brief isFile
 * @param filename 文件位置
 * @return
 */
bool FileCommon::isFile(const QString& filename){
    return QFileInfo::exists(filename);
}

/**
 * 是否存在该文件夹，或者判断该路径是否为文件夹
 * @brief isDir
 * @param dir 文件夹路径
 * @return
 */
bool FileCommon::isDir(const QString& dir){
    QDir d;
    return d.exists(dir);
}

/**
 * 创建目录
 * @brief createDir
 * @param dir 目录位置
 * @return
 */
bool FileCommon::createDir(const QString& dir){
    QDir d(dir);
    if(d.exists()){
        return true;
    }
    QString parent = dir;
    if(d.isRelative()) //判断当前输入的fullpath目录是否为相对路径
    {
        d.makeAbsolute(); //将相对路径转成绝对路径
        parent = d.path(); //dir.path()将输出绝对路径
    }

    if (d.exists()) //如果当前目录已经存在,不在创建
    {
        return true;
    }

    return d.mkpath(parent); //创建多级目录
}

/**
 * 是否存在文件或文件夹
 * @brief isExist
 * @param file  文件或文件夹路径
 * @return
 */
bool FileCommon::isExist(const QString& file){
    return QFile::exists(file) || isDir(file);
}

/**
 * 删除文件
 * @brief deleteFile
 * @param filename 文件位置
 * @return
 */
bool FileCommon::deleteFile(const QString& filename){
    QFile f(filename);
    return f.remove();
}

/**
 * 删除目录
 * @brief deleteDir
 * @param dir 目录位置
 * @return
 */
bool FileCommon::deleteDir(const QString& dir){
    QDir d(dir);
    if(!d.exists()){
        return true;
    }
    if(d.isEmpty()){
        d.rmpath(dir);
        return true;
    }


    d.rmpath(dir);

}

/**
 * 移动文件
 * @brief moveFile
 * @param origin 原位置
 * @param target 目标位置
 * @return
 */
bool FileCommon::moveFile(const QString& origin, const QString& target){
    if(isFile(origin)){
        if(isFile(target)){
            QFile f(origin);
            f.copy(target);
            f.remove();
            return true;
        }

        if(isDir(target)){
            QFile f(origin);
            f.copy(target + QDir::separator() + f.fileName());
            f.remove();
            return true;
        }

    }
    if(isDir(origin)){

        if(isDir(target)){
            QFile f(origin);
            f.copy(target);
            f.remove();
            return true;
        }

    }
}

/**
 * 复制文件
 * @brief copyFile
 * @param origin 原位置
 * @param target 目标位置
 * @return
 */
bool FileCommon::copyFile(const QString& origin, const QString& target){
    if(isFile(origin)){
        if(isFile(target)){
            QFile f(origin);
            f.copy(target);
            return true;
        }

        if(isDir(target)){
            QFile f(origin);
            f.copy(target + QDir::separator() + f.fileName());
            return true;
        }

    }
    if(isDir(origin)){

        if(isDir(target)){
            QFile f(origin);
            f.copy(target);
            return true;
        }

    }
}
